/**
 * 栈
 *
 * 给定一个只包括三种括号 '(' , ')','{' , '}','[' , ']' 的字符串
 * 判断字符串是否有效
 * 左括号必须有相同类型右括号闭合
 * 左括号必须以正确的顺序闭合 - 如 '{[}]' 顺序不对 不正确
 *
 * 解题步骤：
 * 扫描字符串，遇左括号入栈，遇到和栈定括号（最后push入栈的） 类型匹配的右括号就出栈，不匹配判定不合法
 * 栈空了算合法
 * @param {string} s
 */
const isValid = function (s) {
  // 如果是奇数直接 false
  if (s.length % 2 === 1) {
    return false;
  }
  const stack = [];
  for (let i = 0; i < s.length; i += 1) {
    const c = s[i]; // 每一个字符
    if (c === "(" || c === "{" || c === "[") {
      stack.push(c);
    } else {
      const t = stack[stack.length - 1]; // 栈顶括号，数组最后一位
      if (
        (t === "(" && c === ")") ||
        (t === "{" && c === "}") ||
        (t === "[" && c === "]")
      ) {
        stack.pop(); // 删除
      } else {
        return false;
      }
    }
  }
  return stack.length === 0;
};

console.log(isValid("(({[{)]}))"));
